package cn.stylefeng.guns.modular.system.orgdata.service;

import cn.stylefeng.guns.modular.system.orgdata.entity.OrgData;
import cn.stylefeng.guns.modular.system.orgdata.pojo.request.CommonOrgDataTreeRequest;
import cn.stylefeng.guns.modular.system.orgdata.pojo.request.OrgDataRequest;
import cn.stylefeng.guns.modular.system.orgdata.pojo.response.CommonOrgDataTreeResponse;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.rule.pojo.dict.SimpleDict;
import cn.stylefeng.roses.kernel.sys.api.enums.org.DetectModeEnum;
import cn.stylefeng.roses.kernel.sys.api.pojo.org.CompanyDeptDTO;
import cn.stylefeng.roses.kernel.sys.api.remote.OrgInfoRemoteApi;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Set;

/**
 * 组织机构信息 服务类
 *
 * @author fengshuonan
 * @date 2023/06/10 21:23
 */
public interface OrgDataService extends IService<OrgData>, OrgInfoRemoteApi {

    /**
     * 获取组织机构的名称，通过组织机构id
     *
     * @author fengshuonan
     * @since 2023/7/14 16:47
     */
    String getOrgNameById(Long orgId);

    /**
     * 获取指定组织机构的上级组织机构是什么
     * <p>
     * 自下而上：逐级向上获取直到获取到最高级
     * 自上而下：逐级向下获取，直到获取到本层机构
     *
     * @param orgId          指定机构id
     * @param parentLevelNum 上级机构的层级数，从0开始，0代表直接返回本部门
     * @param detectModeEnum 自上而下还是自下而上
     * @return 上级机构的id
     * @author fengshuonan
     * @since 2022/9/18 15:02
     */
    Long getParentLevelOrgId(Long orgId, Integer parentLevelNum, DetectModeEnum detectModeEnum);

    /**
     * 根据组织机构id，获取对应的具体的公司和部门信息
     *
     * @param orgId 组织机构id
     * @return 公司和部门信息
     * @author fengshuonan
     * @since 2023/6/12 15:42
     */
    CompanyDeptDTO getCompanyDeptInfo(Long orgId);

    /**
     * 根据组织机构id，获取这个组织机构id对应的公司部门信息
     *
     * @param orgId 组织机构id
     * @return 单独返回公司信息
     * @author fengshuonan
     * @since 2023/7/2 8:38
     */
    CompanyDeptDTO getOrgCompanyInfo(Long orgId);

    /**
     * 新增
     *
     * @param orgdataRequest 请求参数
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    void add(OrgDataRequest orgdataRequest);

    /**
     * 删除
     *
     * @param orgdataRequest 请求参数
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    void del(OrgDataRequest orgdataRequest);

    /**
     * 批量删除组织机构
     *
     * @author fengshuonan
     * @since 2023/6/11 16:59
     */
    void batchDelete(OrgDataRequest orgdataRequest);

    /**
     * 编辑
     *
     * @param orgdataRequest 请求参数
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    void edit(OrgDataRequest orgdataRequest);

    /**
     * 查询详情
     *
     * @param orgdataRequest 请求参数
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    OrgData detail(OrgDataRequest orgdataRequest);

    /**
     * 获取列表
     *
     * @param orgdataRequest 请求参数
     * @return List<OrgData>   返回结果
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    List<OrgData> findList(OrgDataRequest orgdataRequest);

    /**
     * 获取列表（带分页）
     *
     * @param orgdataRequest 请求参数
     * @return PageResult<OrgData>   返回结果
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    PageResult<OrgData> findPage(OrgDataRequest orgdataRequest);

    /**
     * 分页获取组织机构信息（用在通用选择机构组件中）
     *
     * @param orgdataRequest 请求参数
     * @return PageResult<OrgData>   返回结果
     * @author fengshuonan
     * @date 2023/06/10 21:23
     */
    PageResult<OrgData> commonOrgPage(OrgDataRequest orgdataRequest);

    /**
     * 通用获取组织机构树
     * <p>
     * ps：用在获取用户管理和组织机构管理界面左侧树
     *
     * @author fengshuonan
     * @since 2023/6/11 10:40
     */
    CommonOrgDataTreeResponse commonOrgdataTree(CommonOrgDataTreeRequest commonOrgdataTreeRequest);

    /**
     * 获取组织机构对应的公司信息
     *
     * @param orgdata 被查询的组织机构
     * @return 单独返回公司信息
     * @author fengshuonan
     * @since 2023/6/12 16:09
     */
    CompanyDeptDTO getOrgCompanyInfo(OrgData orgdata);

    /**
     * 获取组织机构统计信息，包含系统的统计，包含当前用户公司的统计
     * <p>
     * 一般用在首页展示组织机构的统计信息界面
     *
     * @author fengshuonan
     * @since 2023/6/26 22:53
     */
    //HomeCompanyInfo orgStatInfo();

    /**
     * 查询组织机构的所有上级，包括上级的上级组织机构
     *
     * @author fengshuonan
     * @since 2023/7/13 20:50
     */
    Set<Long> queryOrgIdParentIdList(Set<Long> orgIdList);

    /**
     * 获取组织机构是否包含下级的标识
     *
     * @param orgId 被查询的组织机构id
     * @return true-包含下级，false-不含下级
     * @author fengshuonan
     * @since 2023/7/14 1:09
     */
    default Boolean getOrgdataHaveSubFlag(Long orgId) {
        return null;
    }

    /**
     * 批量获取组织机构名称
     *
     * @author fengshuonan
     * @since 2023/11/2 10:19
     */
    List<SimpleDict> getOrgListName(OrgDataRequest orgdataRequest);

}